<?php
namespace App\Common\Cla\ClaBase\Traits\Common\MagicGather\Call;

use App\Common as com;
use App\Common\Cla\ClaBase\Traits\Common\MagicGather as cla_MagicGather;
use think\facade\App;

/**
 * 说明：
 * 魔术集->call->get
 * 说明：
 * 	1.类必须带有 "_mgCallGetOfAllow"，[array] 设置允许读的属性。格式[ 'msgSaltKey', ... ] ['all']允许所有
 *  2.优先执行"$this->_mgCallOfGetXxx()"的返回值，其次读取类的属性
 */
class Get extends cla_MagicGather\Base {
	
	/** 魔术方法事件名称 */
	private $eventSid_Module = 'call_get';
	
	/**
	 *
	 * @param obj $son_class_this MagicGather所在的this
	 */
	public function __construct( $magic_gather_this ){
		parent::__construct( $magic_gather_this );
		// 注册魔术方法get回调
		$this->magicGatherApi->registerMagicEvent( 'call', $this->eventSid_Module, function( $name, $arguments ){
			return $this->eventCallback( $name, $arguments );
		} );
	}
	
	/**
	 * 魔术事件回调
	 * @param str $property_name 属性名
	 * @return mixed|com\Lib\Com\Code::$varCustomNull 返回数据 [{mixed}]处理成功，并返回数据 [{com\Lib\Com\Code::$varCustomNull}]处理失败
	 */
	private function eventCallback( $call_name, $arguments ){
		// 检查是否可以处理
		if(substr($call_name, 0, 3) !== 'get') return com\Lib\Com\Code::$varCustomNull;
		// 删除开头的get
		$property_name = com\Lib\Fun\Str::parseName( substr( $call_name, 3 ), 1, false );
		// 检查是否允许外部读取
		if( ! $this->isAllowExternalCallGet( $property_name ) ) return com\Lib\Com\Code::$varCustomNull;
		// 调用预定义方法获取属性值
		$callback_str = '_mgCallGetOf' . com\Lib\Fun\Str::parseName( $property_name, 1, true );
		if( $this->magicGatherApi->methodExists( $callback_str ) ){
			return $this->magicGatherApi->methodCall( $callback_str, $arguments );
		}
		// 直接获取类的属性值
		if( $this->magicGatherApi->propertyExists( $property_name ) ){
			return $this->magicGatherApi->propertyGet( $property_name );
		}
		// 不存在
		return com\Lib\Com\Code::$varCustomNull;
	}
	
	/**
	 * 检查是否允许外部CallGet
	 * @param str $method_name 方法名
	 * @return bool [false]不允许 [true]允许
	 */
	private function isAllowExternalCallGet( $method_name ){
		//
		if( ! $this->magicGatherApi->propertyExists( '_mgCallGetOfAllow' ) ) return false;
		$magic_gather_get_allow = $this->magicGatherApi->propertyGet( '_mgCallGetOfAllow' );
		if( $magic_gather_get_allow == 'all' ) return true; // 允许读取所有
		// 检查可以读的属性
		return in_array( $method_name, $magic_gather_get_allow ?? [] );
	}

}
